import logging
from datetime import datetime
from DataRecorder import Filler
from DrissionPage._functions.keys import Keys
from tools.RequestAPI import 上传物流轨迹
from tools.decorators import log_decorator


@log_decorator
def 获取物流轨迹及具体原因(page, excel_path):
    for _ in range(1000):
        try:
            page('订单', timeout=2).click()
            page('x:/html/body/div[2]/div/div/div[1]/div/div[2]/div/div[1]/div[3]', timeout=2).click()
            # page.get('https://www.erp321.com/app/order/order/list.aspx?archive=true&_c=jst-epaas')
            page.wait(10)
            f = Filler(excel_path, cache_size=1, sign_col='N')
            f.add_data('是否已处理', 'N1')
            count = 1
            for n in f.dict_keys:
                row = n['row']
                线上订单号 = n['订单编号']
                投诉类型 = n['投诉类型']
                数据时间 = n['日期']
                物流单_list = []
                具体原因 = ''
                page('#so_id').input(线上订单号, clear=True)
                page.wait(0.2)
                page.actions.input(Keys.ENTER)
                page.wait(1.5)
                trrs = page('.rowList', timeout=2).children()
                for trr in trrs:
                    物流信息 = []
                    物流单号 = ''
                    发货时间 = ''
                    if page.ele('执行超时，请稍后再试，请勿马上重试', timeout=1):
                        page('执行超时，请稍后再试，请勿马上重试').next().child(1).click(by_js=True)
                    if trr.s_eles('.a look_express'):
                        物流单号 = trr.s_ele('.a look_express').text
                    if 投诉类型 == '发货问题' or 投诉类型 == '发货物流问题':
                        for _ in range(5):
                            if trr('.h_btn p_bth h_btn_show_order copyRemove', timeout=2):
                                trr('.h_btn p_bth h_btn_show_order copyRemove').click(by_js=True)
                                break
                        page.wait(1)
                        # 判断是否为'缺货'异常
                        trs = page.ele('#actions', timeout=2).s_eles('t:tr')
                        for tr in trs:
                            td_时间 = tr.child(1).text
                            td_操作类型 = tr.child(3).text
                            td_操作信息 = tr.child(4).text
                            if td_操作类型 == '标记异常' and '缺货' in td_操作信息:
                                具体原因 = '缺货'
                                break
                            elif td_操作类型 == '发货':
                                发货时间 = td_时间
                        page('._dialog_close_btn').click(by_js=True)
                        page.wait(0.5)
                    if trr.ele('.a look_express', timeout=0.5):
                        trr('.a look_express').click(by_js=True)  # 点击物流单号
                        page.wait(0.5)
                        if len(page('#tab0').s_eles('t:tr')) > 1:
                            tr_list = page('#tab0').eles('t:tr')
                            for index, tr in enumerate(tr_list):
                                if index == 0:
                                    continue
                                td_list = tr.eles('t:td')
                                物流轨迹 = {
                                    '日期': td_list[0].text,
                                    '状态': td_list[1].text,
                                    '轨迹': td_list[2].text
                                }
                                物流信息.append(物流轨迹)
                                if index == 1 and td_list[1].text != '签收':
                                    时间差 = datetime.now() - datetime.strptime(td_list[0].text, '%Y-%m-%d %H:%M:%S')
                                    时间差_hour = 时间差.days * 24 + 时间差.seconds / 3600
                                    if 时间差_hour > 48 and 投诉类型 == '发货问题':
                                        具体原因 = '超过48小时物流未更新'
                        else:
                            if 发货时间 != '':
                                时间差 = datetime.now() - datetime.strptime(发货时间, '%Y-%m-%d %H:%M:%S')
                                时间差_hour = 时间差.days * 24 + 时间差.seconds / 3600
                                if 时间差_hour > 48 and 投诉类型 == '发货问题':
                                    具体原因 = '超过48小时无揽收记录'
                        物流单 = {
                            '物流单号': 物流单号,
                            '物流信息': 物流信息,
                        }
                        物流单_list.append(物流单)
                        page('.close_btn').click(by_js=True)
                        page.wait(0.5)
                    else:
                        datetime_obj = datetime.strptime(数据时间, '%Y-%m-%d %H:%M:%S')
                        new_string = datetime_obj.strftime('%Y%m%d%H%M%S')
                        物流单 = {
                            '物流单号': 'K' + new_string + str(count),
                            '物流信息': 物流信息,
                        }
                        物流单_list.append(物流单)
                        count += 1
                data = {
                    '线上订单号': 线上订单号,
                    '物流单': 物流单_list,
                    '具体原因': 具体原因,
                    '数据时间': 数据时间
                }
                f.add_data(具体原因, (row, 'J'))
                f.add_data('已处理', row)
                print(data)
                上传物流轨迹(data)
            logging.info('物流轨迹获取完成')
            return '物流轨迹获取完成'
        except Exception as e:
            print(e)
            page.refresh()
    logging.info('物流轨迹获取失败')
    raise Exception('物流轨迹获取失败')
